Home | History | Annotate | Download | only in include
      1 /**************************************************************************\
      2 *
      3 * Copyright (c) 1998-2000, Microsoft Corp.  All Rights Reserved.
      4 *
      5 * Module Name:
      6 *
      7 *   GdiplusGraphics.h
      8 *
      9 * Abstract:
     10 *
     11 *   Declarations for Graphics class
     12 *
     13 \**************************************************************************/
     14 
     15 #ifndef _GDIPLUSGRAPHICS_H
     16 #define _GDIPLUSGRAPHICS_H
     17 
     18 /**
     19  * Represent a graphics context
     20  */
     21 class Graphics : public GdiplusBase
     22 {
     23 public:
     24     friend class Region;
     25     friend class GraphicsPath;
     26     friend class Image;
     27     friend class Bitmap;
     28     friend class Metafile;
     29     friend class Font;
     30     friend class FontFamily;
     31     friend class FontCollection;
     32     friend class CachedBitmap;
     33 
     34     // Get a graphics context from an existing Win32 HDC or HWND
     35     static Graphics* FromHDC(IN HDC hdc)
     36     {
     37         return new Graphics(hdc);
     38     }
     39 
     40     static Graphics* FromHDC(IN HDC hdc,
     41                              IN HANDLE hdevice)
     42     {
     43         return new Graphics(hdc, hdevice);
     44     }
     45 
     46     static Graphics* FromHWND(IN HWND hwnd,
     47                               IN BOOL icm = FALSE)
     48     {
     49         return new Graphics(hwnd, icm);
     50     }
     51 
     52     static Graphics* FromImage(IN Image *image)
     53     {
     54         return new Graphics(image);
     55     }
     56 
     57     Graphics(IN HDC hdc)
     58     {
     59         GpGraphics *graphics = NULL;
     60 
     61         lastResult = DllExports::GdipCreateFromHDC(hdc, &graphics);
     62 
     63         SetNativeGraphics(graphics);
     64     }
     65 
     66     Graphics(IN HDC hdc,
     67              IN HANDLE hdevice)
     68     {
     69         GpGraphics *graphics = NULL;
     70 
     71         lastResult = DllExports::GdipCreateFromHDC2(hdc, hdevice, &graphics);
     72 
     73         SetNativeGraphics(graphics);
     74     }
     75 
     76     Graphics(IN HWND hwnd,
     77              IN BOOL icm = FALSE)
     78     {
     79         GpGraphics *graphics = NULL;
     80 
     81         if (icm)
     82         {
     83             lastResult = DllExports::GdipCreateFromHWNDICM(hwnd, &graphics);
     84         }
     85         else
     86         {
     87             lastResult = DllExports::GdipCreateFromHWND(hwnd, &graphics);
     88         }
     89 
     90         SetNativeGraphics(graphics);
     91     }
     92 
     93     Graphics(IN Image* image)
     94     {
     95         GpGraphics *graphics = NULL;
     96 
     97         if (image != NULL)
     98         {
     99             lastResult = DllExports::GdipGetImageGraphicsContext(
    100                                                                 image->nativeImage, &graphics);
    101         }
    102         SetNativeGraphics(graphics);
    103     }
    104 
    105     ~Graphics()
    106     {
    107         DllExports::GdipDeleteGraphics(nativeGraphics);
    108     }
    109 
    110     VOID Flush(IN FlushIntention intention = FlushIntentionFlush)
    111     {
    112         DllExports::GdipFlush(nativeGraphics, intention);
    113     }
    114 
    115     //------------------------------------------------------------------------
    116     // Interop methods
    117     //------------------------------------------------------------------------
    118 
    119     // Locks the graphics until ReleaseDC is called
    120     HDC GetHDC()
    121     {
    122         HDC     hdc = NULL;
    123 
    124         SetStatus(DllExports::GdipGetDC(nativeGraphics, &hdc));
    125 
    126         return hdc;
    127     }
    128 
    129     VOID ReleaseHDC(IN HDC hdc)
    130     {
    131         SetStatus(DllExports::GdipReleaseDC(nativeGraphics, hdc));
    132     }
    133 
    134     //------------------------------------------------------------------------
    135     // Rendering modes
    136     //------------------------------------------------------------------------
    137 
    138     Status SetRenderingOrigin(IN INT x, IN INT y)
    139     {
    140         return SetStatus(
    141             DllExports::GdipSetRenderingOrigin(
    142                 nativeGraphics, x, y
    143             )
    144         );
    145     }
    146 
    147     Status GetRenderingOrigin(OUT INT *x, OUT INT *y) const
    148     {
    149         return SetStatus(
    150             DllExports::GdipGetRenderingOrigin(
    151                 nativeGraphics, x, y
    152             )
    153         );
    154     }
    155 
    156     Status SetCompositingMode(IN CompositingMode compositingMode)
    157     {
    158         return SetStatus(DllExports::GdipSetCompositingMode(nativeGraphics,
    159                                                             compositingMode));
    160     }
    161 
    162     CompositingMode GetCompositingMode() const
    163     {
    164         CompositingMode mode;
    165 
    166         SetStatus(DllExports::GdipGetCompositingMode(nativeGraphics,
    167                                                      &mode));
    168 
    169         return mode;
    170     }
    171 
    172     Status SetCompositingQuality(IN CompositingQuality compositingQuality)
    173     {
    174         return SetStatus(DllExports::GdipSetCompositingQuality(
    175             nativeGraphics,
    176             compositingQuality));
    177     }
    178 
    179     CompositingQuality GetCompositingQuality() const
    180     {
    181         CompositingQuality quality;
    182 
    183         SetStatus(DllExports::GdipGetCompositingQuality(
    184             nativeGraphics,
    185             &quality));
    186 
    187         return quality;
    188     }
    189 
    190     Status SetTextRenderingHint(IN TextRenderingHint newMode)
    191     {
    192 #ifndef DCR_USE_NEW_186764
    193 		/* temporarly set the high bit to warn that we are using the new definition for the flag */
    194 		newMode = (TextRenderingHint) (newMode | 0x0f000);
    195 #endif // DCR_USE_NEW_186764
    196         return SetStatus(DllExports::GdipSetTextRenderingHint(nativeGraphics,
    197                                                           newMode));
    198     }
    199 
    200     TextRenderingHint GetTextRenderingHint() const
    201     {
    202         TextRenderingHint hint;
    203 
    204         SetStatus(DllExports::GdipGetTextRenderingHint(nativeGraphics,
    205                                                    &hint));
    206 
    207         return hint;
    208     }
    209 
    210 #ifdef DCR_USE_NEW_188922
    211     Status SetTextContrast(IN UINT contrast)
    212     {
    213         return SetStatus(DllExports::GdipSetTextContrast(nativeGraphics,
    214                                                           contrast));
    215     }
    216 
    217     UINT GetTextContrast() const
    218     {
    219         UINT contrast;
    220 
    221         SetStatus(DllExports::GdipGetTextContrast(nativeGraphics,
    222                                                     &contrast));
    223 
    224         return contrast;
    225     }
    226 #else
    227     Status SetTextGammaValue(IN UINT gammaValue)
    228     {
    229         return SetStatus(DllExports::GdipSetTextGammaValue(nativeGraphics,
    230                                                           gammaValue));
    231     }
    232 
    233     UINT GetTextGammaValue() const
    234     {
    235         UINT gammaValue;
    236 
    237         SetStatus(DllExports::GdipGetTextGammaValue(nativeGraphics,
    238                                                     &gammaValue));
    239 
    240         return gammaValue;
    241     }
    242 
    243 #endif // DCR_USE_NEW_188922
    244 
    245 
    246     InterpolationMode GetInterpolationMode() const
    247     {
    248         InterpolationMode mode = InterpolationModeInvalid;
    249 
    250         SetStatus(DllExports::GdipGetInterpolationMode(nativeGraphics,
    251                                                            &mode));
    252 
    253         return mode;
    254     }
    255 
    256     Status SetInterpolationMode(IN InterpolationMode interpolationMode)
    257     {
    258         return SetStatus(DllExports::GdipSetInterpolationMode(nativeGraphics,
    259                                                            interpolationMode));
    260     }
    261 
    262     SmoothingMode GetSmoothingMode() const
    263     {
    264         SmoothingMode smoothingMode = SmoothingModeInvalid;
    265 
    266         SetStatus(DllExports::GdipGetSmoothingMode(nativeGraphics,
    267                                                    &smoothingMode));
    268 
    269         return smoothingMode;
    270     }
    271 
    272     Status SetSmoothingMode(IN SmoothingMode smoothingMode)
    273     {
    274         return SetStatus(DllExports::GdipSetSmoothingMode(nativeGraphics,
    275                                                           smoothingMode));
    276     }
    277 
    278     PixelOffsetMode GetPixelOffsetMode() const
    279     {
    280         PixelOffsetMode pixelOffsetMode = PixelOffsetModeInvalid;
    281 
    282         SetStatus(DllExports::GdipGetPixelOffsetMode(nativeGraphics,
    283                                                      &pixelOffsetMode));
    284 
    285         return pixelOffsetMode;
    286     }
    287 
    288     Status SetPixelOffsetMode(IN PixelOffsetMode pixelOffsetMode)
    289     {
    290         return SetStatus(DllExports::GdipSetPixelOffsetMode(nativeGraphics,
    291                                                             pixelOffsetMode));
    292     }
    293 
    294     //------------------------------------------------------------------------
    295     // Manipulate the current world transform
    296     //------------------------------------------------------------------------
    297 
    298     Status SetTransform(IN const Matrix* matrix)
    299     {
    300         return SetStatus(DllExports::GdipSetWorldTransform(nativeGraphics,
    301                                                         matrix->nativeMatrix));
    302     }
    303     Status ResetTransform()
    304     {
    305         return SetStatus(DllExports::GdipResetWorldTransform(nativeGraphics));
    306     }
    307 
    308     Status MultiplyTransform(IN const Matrix* matrix,
    309                              IN MatrixOrder order = MatrixOrderPrepend)
    310     {
    311         return SetStatus(DllExports::GdipMultiplyWorldTransform(nativeGraphics,
    312                                                                 matrix->nativeMatrix,
    313                                                                 order));
    314     }
    315 
    316     Status TranslateTransform(IN REAL dx,
    317                               IN REAL dy,
    318                               IN MatrixOrder order = MatrixOrderPrepend)
    319     {
    320         return SetStatus(DllExports::GdipTranslateWorldTransform(nativeGraphics,
    321                                                                dx, dy, order));
    322     }
    323 
    324     Status ScaleTransform(IN REAL sx,
    325                           IN REAL sy,
    326                           IN MatrixOrder order = MatrixOrderPrepend)
    327     {
    328         return SetStatus(DllExports::GdipScaleWorldTransform(nativeGraphics,
    329                                                              sx, sy, order));
    330     }
    331 
    332     Status RotateTransform(IN REAL angle,
    333                            IN MatrixOrder order = MatrixOrderPrepend)
    334     {
    335         return SetStatus(DllExports::GdipRotateWorldTransform(nativeGraphics,
    336                                                               angle, order));
    337     }
    338 
    339     /**
    340      * Return the current world transform
    341      */
    342 
    343     Status GetTransform(OUT Matrix* matrix) const
    344     {
    345         return SetStatus(DllExports::GdipGetWorldTransform(nativeGraphics,
    346                                                            matrix->nativeMatrix));
    347     }
    348 
    349     /**
    350      * Manipulate the current page transform
    351      */
    352 
    353     Status SetPageUnit(IN Unit unit)
    354     {
    355         return SetStatus(DllExports::GdipSetPageUnit(nativeGraphics,
    356                                                      unit));
    357     }
    358 
    359     Status SetPageScale(IN REAL scale)
    360     {
    361         return SetStatus(DllExports::GdipSetPageScale(nativeGraphics,
    362                                                       scale));
    363     }
    364 
    365     /**
    366      * Retrieve the current page transform information
    367      * notes @ these are atomic
    368      */
    369     Unit GetPageUnit() const
    370     {
    371         Unit unit;
    372 
    373         SetStatus(DllExports::GdipGetPageUnit(nativeGraphics, &unit));
    374 
    375         return unit;
    376     }
    377 
    378     REAL GetPageScale() const
    379     {
    380         REAL scale;
    381 
    382         SetStatus(DllExports::GdipGetPageScale(nativeGraphics, &scale));
    383 
    384         return scale;
    385     }
    386 
    387     REAL GetDpiX() const
    388     {
    389         REAL dpi;
    390 
    391         SetStatus(DllExports::GdipGetDpiX(nativeGraphics, &dpi));
    392 
    393         return dpi;
    394     }
    395 
    396     REAL GetDpiY() const
    397     {
    398         REAL dpi;
    399 
    400         SetStatus(DllExports::GdipGetDpiY(nativeGraphics, &dpi));
    401 
    402         return dpi;
    403     }
    404 
    405     /**
    406      * Transform points in the current graphics context
    407      */
    408     // float version
    409     Status TransformPoints(IN CoordinateSpace destSpace,
    410                            IN CoordinateSpace srcSpace,
    411                            IN OUT PointF* pts,
    412                            IN INT count) const
    413     {
    414         return SetStatus(DllExports::GdipTransformPoints(nativeGraphics,
    415                                                          destSpace,
    416                                                          srcSpace,
    417                                                          pts,
    418                                                          count));
    419     }
    420 
    421     // integer version
    422     Status TransformPoints(IN CoordinateSpace destSpace,
    423                            IN CoordinateSpace srcSpace,
    424                            IN OUT Point* pts,
    425                            IN INT count) const
    426     {
    427 
    428         return SetStatus(DllExports::GdipTransformPointsI(nativeGraphics,
    429                                                           destSpace,
    430                                                           srcSpace,
    431                                                           pts,
    432                                                           count));
    433     }
    434 
    435     //------------------------------------------------------------------------
    436     // GetNearestColor (for <= 8bpp surfaces)
    437     // Note: alpha is ignored
    438     //------------------------------------------------------------------------
    439     Status GetNearestColor(IN OUT Color* color) const
    440     {
    441         if (color == NULL)
    442         {
    443             return SetStatus(InvalidParameter);
    444         }
    445 
    446         ARGB argb = color->GetValue();
    447 
    448         Status status = SetStatus(DllExports::GdipGetNearestColor(nativeGraphics, &argb));
    449 
    450         color->SetValue(argb);
    451 
    452         return status;
    453     }
    454 
    455     /**
    456      * Vector drawing methods
    457      *
    458      * @notes Do we need a set of methods that take
    459      *  integer coordinate parameters?
    460      */
    461 
    462     // float version
    463     Status DrawLine(IN const Pen* pen,
    464                     IN REAL x1,
    465                     IN REAL y1,
    466                     IN REAL x2,
    467                     IN REAL y2)
    468     {
    469         return SetStatus(DllExports::GdipDrawLine(nativeGraphics,
    470                                                   pen->nativePen, x1, y1, x2,
    471                                                   y2));
    472     }
    473 
    474     Status DrawLine(IN const Pen* pen,
    475                     IN const PointF& pt1,
    476                     IN const PointF& pt2)
    477     {
    478         return DrawLine(pen, pt1.X, pt1.Y, pt2.X, pt2.Y);
    479     }
    480 
    481     Status DrawLines(IN const Pen* pen,
    482                      IN const PointF* points,
    483                      IN INT count)
    484     {
    485         return SetStatus(DllExports::GdipDrawLines(nativeGraphics,
    486                                                    pen->nativePen,
    487                                                    points, count));
    488     }
    489 
    490     // int version
    491     Status DrawLine(IN const Pen* pen,
    492                     IN INT x1,
    493                     IN INT y1,
    494                     IN INT x2,
    495                     IN INT y2)
    496     {
    497         return SetStatus(DllExports::GdipDrawLineI(nativeGraphics,
    498                                                    pen->nativePen,
    499                                                    x1,
    500                                                    y1,
    501                                                    x2,
    502                                                    y2));
    503     }
    504 
    505     Status DrawLine(IN const Pen* pen,
    506                     IN const Point& pt1,
    507                     IN const Point& pt2)
    508     {
    509         return DrawLine(pen,
    510                         pt1.X,
    511                         pt1.Y,
    512                         pt2.X,
    513                         pt2.Y);
    514     }
    515 
    516     Status DrawLines(IN const Pen* pen,
    517                      IN const Point* points,
    518                      IN INT count)
    519     {
    520         return SetStatus(DllExports::GdipDrawLinesI(nativeGraphics,
    521                                                     pen->nativePen,
    522                                                     points,
    523                                                     count));
    524     }
    525 
    526     // float version
    527     Status DrawArc(IN const Pen* pen,
    528                    IN REAL x,
    529                    IN REAL y,
    530                    IN REAL width,
    531                    IN REAL height,
    532                    IN REAL startAngle,
    533                    IN REAL sweepAngle)
    534     {
    535         return SetStatus(DllExports::GdipDrawArc(nativeGraphics,
    536                                                  pen->nativePen,
    537                                                  x,
    538                                                  y,
    539                                                  width,
    540                                                  height,
    541                                                  startAngle,
    542                                                  sweepAngle));
    543     }
    544 
    545     Status DrawArc(IN const Pen* pen,
    546                    IN const RectF& rect,
    547                    IN REAL startAngle,
    548                    IN REAL sweepAngle)
    549     {
    550         return DrawArc(pen, rect.X, rect.Y, rect.Width, rect.Height,
    551                        startAngle, sweepAngle);
    552     }
    553 
    554     // int version
    555     Status DrawArc(IN const Pen* pen,
    556                    IN INT x,
    557                    IN INT y,
    558                    IN INT width,
    559                    IN INT height,
    560                    IN REAL startAngle,
    561                    IN REAL sweepAngle)
    562     {
    563         return SetStatus(DllExports::GdipDrawArcI(nativeGraphics,
    564                                                   pen->nativePen,
    565                                                   x,
    566                                                   y,
    567                                                   width,
    568                                                   height,
    569                                                   startAngle,
    570                                                   sweepAngle));
    571     }
    572 
    573 
    574     Status DrawArc(IN const Pen* pen,
    575                    IN const Rect& rect,
    576                    IN REAL startAngle,
    577                    IN REAL sweepAngle)
    578     {
    579         return DrawArc(pen,
    580                        rect.X,
    581                        rect.Y,
    582                        rect.Width,
    583                        rect.Height,
    584                        startAngle,
    585                        sweepAngle);
    586     }
    587 
    588     // float version
    589     Status DrawBezier(IN const Pen* pen,
    590                       IN REAL x1,
    591                       IN REAL y1,
    592                       IN REAL x2,
    593                       IN REAL y2,
    594                       IN REAL x3,
    595                       IN REAL y3,
    596                       IN REAL x4,
    597                       IN REAL y4)
    598     {
    599         return SetStatus(DllExports::GdipDrawBezier(nativeGraphics,
    600                                                     pen->nativePen, x1, y1,
    601                                                     x2, y2, x3, y3, x4, y4));
    602     }
    603 
    604     Status DrawBezier(IN const Pen* pen,
    605                       IN const PointF& pt1,
    606                       IN const PointF& pt2,
    607                       IN const PointF& pt3,
    608                       IN const PointF& pt4)
    609     {
    610         return DrawBezier(pen,
    611                           pt1.X,
    612                           pt1.Y,
    613                           pt2.X,
    614                           pt2.Y,
    615                           pt3.X,
    616                           pt3.Y,
    617                           pt4.X,
    618                           pt4.Y);
    619     }
    620 
    621     Status DrawBeziers(IN const Pen* pen,
    622                        IN const PointF* points,
    623                        IN INT count)
    624     {
    625         return SetStatus(DllExports::GdipDrawBeziers(nativeGraphics,
    626                                                      pen->nativePen,
    627                                                      points,
    628                                                      count));
    629     }
    630 
    631     // int version
    632     Status DrawBezier(IN const Pen* pen,
    633                       IN INT x1,
    634                       IN INT y1,
    635                       IN INT x2,
    636                       IN INT y2,
    637                       IN INT x3,
    638                       IN INT y3,
    639                       IN INT x4,
    640                       IN INT y4)
    641     {
    642         return SetStatus(DllExports::GdipDrawBezierI(nativeGraphics,
    643                                                      pen->nativePen,
    644                                                      x1,
    645                                                      y1,
    646                                                      x2,
    647                                                      y2,
    648                                                      x3,
    649                                                      y3,
    650                                                      x4,
    651                                                      y4));
    652     }
    653 
    654     Status DrawBezier(IN const Pen* pen,
    655                       IN const Point& pt1,
    656                       IN const Point& pt2,
    657                       IN const Point& pt3,
    658                       IN const Point& pt4)
    659     {
    660         return DrawBezier(pen,
    661                           pt1.X,
    662                           pt1.Y,
    663                           pt2.X,
    664                           pt2.Y,
    665                           pt3.X,
    666                           pt3.Y,
    667                           pt4.X,
    668                           pt4.Y);
    669     }
    670 
    671     Status DrawBeziers(IN const Pen* pen,
    672                        IN const Point* points,
    673                        IN INT count)
    674     {
    675         return SetStatus(DllExports::GdipDrawBeziersI(nativeGraphics,
    676                                                       pen->nativePen,
    677                                                       points,
    678                                                       count));
    679     }
    680 
    681     // float version
    682     Status DrawRectangle(IN const Pen* pen,
    683                          IN const RectF& rect)
    684     {
    685         return DrawRectangle(pen, rect.X, rect.Y, rect.Width, rect.Height);
    686     }
    687 
    688     Status DrawRectangle(IN const Pen* pen,
    689                          IN REAL x,
    690                          IN REAL y,
    691                          IN REAL width,
    692                          IN REAL height)
    693     {
    694         return SetStatus(DllExports::GdipDrawRectangle(nativeGraphics,
    695                                                        pen->nativePen, x, y,
    696                                                        width, height));
    697     }
    698 
    699     Status DrawRectangles(IN const Pen* pen,
    700                           IN const RectF* rects,
    701                           IN INT count)
    702     {
    703         return SetStatus(DllExports::GdipDrawRectangles(nativeGraphics,
    704                                                         pen->nativePen,
    705                                                         rects, count));
    706     }
    707 
    708     // integer version
    709     Status DrawRectangle(IN const Pen* pen,
    710                          IN const Rect& rect)
    711     {
    712         return DrawRectangle(pen,
    713                              rect.X,
    714                              rect.Y,
    715                              rect.Width,
    716                              rect.Height);
    717     }
    718 
    719     Status DrawRectangle(IN const Pen* pen,
    720                          IN INT x,
    721                          IN INT y,
    722                          IN INT width,
    723                          IN INT height)
    724     {
    725         return SetStatus(DllExports::GdipDrawRectangleI(nativeGraphics,
    726                                                         pen->nativePen,
    727                                                         x,
    728                                                         y,
    729                                                         width,
    730                                                         height));
    731     }
    732 
    733     Status DrawRectangles(IN const Pen* pen,
    734                           IN const Rect* rects,
    735                           IN INT count)
    736     {
    737         return SetStatus(DllExports::GdipDrawRectanglesI(nativeGraphics,
    738                                                          pen->nativePen,
    739                                                          rects,
    740                                                          count));
    741     }
    742 
    743     // float version
    744     Status DrawEllipse(IN const Pen* pen,
    745                        IN const RectF& rect)
    746     {
    747         return DrawEllipse(pen, rect.X, rect.Y, rect.Width, rect.Height);
    748     }
    749 
    750     Status DrawEllipse(IN const Pen* pen,
    751                        IN REAL x,
    752                        IN REAL y,
    753                        IN REAL width,
    754                        IN REAL height)
    755     {
    756         return SetStatus(DllExports::GdipDrawEllipse(nativeGraphics,
    757                                                      pen->nativePen,
    758                                                      x,
    759                                                      y,
    760                                                      width,
    761                                                      height));
    762     }
    763 
    764     // integer version
    765     Status DrawEllipse(IN const Pen* pen,
    766                        IN const Rect& rect)
    767     {
    768         return DrawEllipse(pen,
    769                            rect.X,
    770                            rect.Y,
    771                            rect.Width,
    772                            rect.Height);
    773     }
    774 
    775     Status DrawEllipse(IN const Pen* pen,
    776                        IN INT x,
    777                        IN INT y,
    778                        IN INT width,
    779                        IN INT height)
    780     {
    781         return SetStatus(DllExports::GdipDrawEllipseI(nativeGraphics,
    782                                                       pen->nativePen,
    783                                                       x,
    784                                                       y,
    785                                                       width,
    786                                                       height));
    787     }
    788 
    789     // floating point version
    790     Status DrawPie(IN const Pen* pen,
    791                    IN const RectF& rect,
    792                    IN REAL startAngle,
    793                    IN REAL sweepAngle)
    794     {
    795         return DrawPie(pen,
    796                        rect.X,
    797                        rect.Y,
    798                        rect.Width,
    799                        rect.Height,
    800                        startAngle,
    801                        sweepAngle);
    802     }
    803 
    804     Status DrawPie(IN const Pen* pen,
    805                    IN REAL x,
    806                    IN REAL y,
    807                    IN REAL width,
    808                    IN REAL height,
    809                    IN REAL startAngle,
    810                    IN REAL sweepAngle)
    811     {
    812         return SetStatus(DllExports::GdipDrawPie(nativeGraphics,
    813                                                  pen->nativePen,
    814                                                  x,
    815                                                  y,
    816                                                  width,
    817                                                  height,
    818                                                  startAngle,
    819                                                  sweepAngle));
    820     }
    821 
    822     // integer point version
    823     Status DrawPie(IN const Pen* pen,
    824                    IN const Rect& rect,
    825                    IN REAL startAngle,
    826                    IN REAL sweepAngle)
    827     {
    828         return DrawPie(pen,
    829                        rect.X,
    830                        rect.Y,
    831                        rect.Width,
    832                        rect.Height,
    833                        startAngle,
    834                        sweepAngle);
    835     }
    836 
    837     Status DrawPie(IN const Pen* pen,
    838                    IN INT x,
    839                    IN INT y,
    840                    IN INT width,
    841                    IN INT height,
    842                    IN REAL startAngle,
    843                    IN REAL sweepAngle)
    844     {
    845         return SetStatus(DllExports::GdipDrawPieI(nativeGraphics,
    846                                                   pen->nativePen,
    847                                                   x,
    848                                                   y,
    849                                                   width,
    850                                                   height,
    851                                                   startAngle,
    852                                                   sweepAngle));
    853     }
    854 
    855     // float version
    856     Status DrawPolygon(IN const Pen* pen,
    857                        IN const PointF* points,
    858                        IN INT count)
    859     {
    860         return SetStatus(DllExports::GdipDrawPolygon(nativeGraphics,
    861                                                      pen->nativePen,
    862                                                      points,
    863                                                      count));
    864     }
    865 
    866     // integer version
    867     Status DrawPolygon(IN const Pen* pen,
    868                        IN const Point* points,
    869                        IN INT count)
    870     {
    871         return SetStatus(DllExports::GdipDrawPolygonI(nativeGraphics,
    872                                                       pen->nativePen,
    873                                                       points,
    874                                                       count));
    875     }
    876 
    877     // float version
    878     Status DrawPath(IN const Pen* pen,
    879                     IN const GraphicsPath* path)
    880     {
    881         return SetStatus(DllExports::GdipDrawPath(nativeGraphics,
    882                                                   pen ? pen->nativePen : NULL,
    883                                                   path ? path->nativePath : NULL));
    884     }
    885 
    886     // float version
    887     Status DrawCurve(IN const Pen* pen,
    888                      IN const PointF* points,
    889                      IN INT count)
    890     {
    891         return SetStatus(DllExports::GdipDrawCurve(nativeGraphics,
    892                                                    pen->nativePen, points,
    893                                                    count));
    894     }
    895 
    896     Status DrawCurve(IN const Pen* pen,
    897                      IN const PointF* points,
    898                      IN INT count,
    899                      IN REAL tension)
    900     {
    901         return SetStatus(DllExports::GdipDrawCurve2(nativeGraphics,
    902                                                     pen->nativePen, points,
    903                                                     count, tension));
    904     }
    905 
    906     Status DrawCurve(IN const Pen* pen,
    907                      IN const PointF* points,
    908                      IN INT count,
    909                      IN INT offset,
    910                      IN INT numberOfSegments,
    911                      IN REAL tension = 0.5f)
    912     {
    913         return SetStatus(DllExports::GdipDrawCurve3(nativeGraphics,
    914                                                     pen->nativePen, points,
    915                                                     count, offset,
    916                                                     numberOfSegments, tension));
    917     }
    918 
    919     // integer version
    920     Status DrawCurve(IN const Pen* pen,
    921                      IN const Point* points,
    922                      IN INT count)
    923     {
    924         return SetStatus(DllExports::GdipDrawCurveI(nativeGraphics,
    925                                                     pen->nativePen,
    926                                                     points,
    927                                                     count));
    928     }
    929 
    930     Status DrawCurve(IN const Pen* pen,
    931                      IN const Point* points,
    932                      IN INT count,
    933                      IN REAL tension)
    934     {
    935         return SetStatus(DllExports::GdipDrawCurve2I(nativeGraphics,
    936                                                      pen->nativePen,
    937                                                      points,
    938                                                      count,
    939                                                      tension));
    940     }
    941 
    942     Status DrawCurve(IN const Pen* pen,
    943                      IN const Point* points,
    944                      IN INT count,
    945                      IN INT offset,
    946                      IN INT numberOfSegments,
    947                      IN REAL tension = 0.5f)
    948     {
    949         return SetStatus(DllExports::GdipDrawCurve3I(nativeGraphics,
    950                                                      pen->nativePen,
    951                                                      points,
    952                                                      count,
    953                                                      offset,
    954                                                      numberOfSegments,
    955                                                      tension));
    956     }
    957 
    958     // float version
    959     Status DrawClosedCurve(IN const Pen* pen,
    960                            IN const PointF* points,
    961                            IN INT count)
    962     {
    963         return SetStatus(DllExports::GdipDrawClosedCurve(nativeGraphics,
    964                                                          pen->nativePen,
    965                                                          points, count));
    966     }
    967 
    968     Status DrawClosedCurve(IN const Pen *pen,
    969                            IN const PointF* points,
    970                            IN INT count,
    971                            IN REAL tension)
    972     {
    973         return SetStatus(DllExports::GdipDrawClosedCurve2(nativeGraphics,
    974                                                           pen->nativePen,
    975                                                           points, count,
    976                                                           tension));
    977     }
    978 
    979     // integer version
    980     Status DrawClosedCurve(IN const Pen* pen,
    981                            IN const Point* points,
    982                            IN INT count)
    983     {
    984         return SetStatus(DllExports::GdipDrawClosedCurveI(nativeGraphics,
    985                                                           pen->nativePen,
    986                                                           points,
    987                                                           count));
    988     }
    989 
    990     Status DrawClosedCurve(IN const Pen *pen,
    991                            IN const Point* points,
    992                            IN INT count,
    993                            IN REAL tension)
    994     {
    995         return SetStatus(DllExports::GdipDrawClosedCurve2I(nativeGraphics,
    996                                                            pen->nativePen,
    997                                                            points,
    998                                                            count,
    999                                                            tension));
   1000     }
   1001 
   1002     Status Clear(IN const Color &color)
   1003     {
   1004         return SetStatus(DllExports::GdipGraphicsClear(
   1005             nativeGraphics,
   1006             color.GetValue()));
   1007     }
   1008 
   1009     // float version
   1010     Status FillRectangle(IN const Brush* brush,
   1011                          IN const RectF& rect)
   1012     {
   1013         return FillRectangle(brush, rect.X, rect.Y, rect.Width, rect.Height);
   1014     }
   1015 
   1016     Status FillRectangle(IN const Brush* brush,
   1017                          IN REAL x,
   1018                          IN REAL y,
   1019                          IN REAL width,
   1020                          IN REAL height)
   1021     {
   1022         return SetStatus(DllExports::GdipFillRectangle(nativeGraphics,
   1023                                                        brush->nativeBrush, x, y,
   1024                                                        width, height));
   1025     }
   1026 
   1027     Status FillRectangles(IN const Brush* brush,
   1028                           IN const RectF* rects,
   1029                           IN INT count)
   1030     {
   1031         return SetStatus(DllExports::GdipFillRectangles(nativeGraphics,
   1032                                                         brush->nativeBrush,
   1033                                                         rects, count));
   1034     }
   1035 
   1036     // integer version
   1037     Status FillRectangle(IN const Brush* brush,
   1038                          IN const Rect& rect)
   1039     {
   1040         return FillRectangle(brush,
   1041                              rect.X,
   1042                              rect.Y,
   1043                              rect.Width,
   1044                              rect.Height);
   1045     }
   1046 
   1047     Status FillRectangle(IN const Brush* brush,
   1048                          IN INT x,
   1049                          IN INT y,
   1050                          IN INT width,
   1051                          IN INT height)
   1052     {
   1053         return SetStatus(DllExports::GdipFillRectangleI(nativeGraphics,
   1054                                                         brush->nativeBrush,
   1055                                                         x,
   1056                                                         y,
   1057                                                         width,
   1058                                                         height));
   1059     }
   1060 
   1061     Status FillRectangles(IN const Brush* brush,
   1062                           IN const Rect* rects,
   1063                           IN INT count)
   1064     {
   1065         return SetStatus(DllExports::GdipFillRectanglesI(nativeGraphics,
   1066                                                          brush->nativeBrush,
   1067                                                          rects,
   1068                                                          count));
   1069     }
   1070 
   1071     // float version
   1072     Status FillPolygon(IN const Brush* brush,
   1073                        IN const PointF* points,
   1074                        IN INT count)
   1075     {
   1076         return FillPolygon(brush, points, count, FillModeAlternate);
   1077     }
   1078 
   1079     Status FillPolygon(IN const Brush* brush,
   1080                        IN const PointF* points,
   1081                        IN INT count,
   1082                        IN FillMode fillMode)
   1083     {
   1084         return SetStatus(DllExports::GdipFillPolygon(nativeGraphics,
   1085                                                      brush->nativeBrush,
   1086                                                      points, count, fillMode));
   1087     }
   1088 
   1089     // integer version
   1090     Status FillPolygon(IN const Brush* brush,
   1091                        IN const Point* points,
   1092                        IN INT count)
   1093     {
   1094         return FillPolygon(brush, points, count, FillModeAlternate);
   1095     }
   1096 
   1097     Status FillPolygon(IN const Brush* brush,
   1098                        IN const Point* points,
   1099                        IN INT count,
   1100                        IN FillMode fillMode)
   1101     {
   1102         return SetStatus(DllExports::GdipFillPolygonI(nativeGraphics,
   1103                                                       brush->nativeBrush,
   1104                                                       points, count,
   1105                                                       fillMode));
   1106     }
   1107 
   1108     // float version
   1109     Status FillEllipse(IN const Brush* brush,
   1110                        IN const RectF& rect)
   1111     {
   1112         return FillEllipse(brush, rect.X, rect.Y, rect.Width, rect.Height);
   1113     }
   1114 
   1115     Status FillEllipse(IN const Brush* brush,
   1116                        IN REAL x,
   1117                        IN REAL y,
   1118                        IN REAL width,
   1119                        IN REAL height)
   1120     {
   1121         return SetStatus(DllExports::GdipFillEllipse(nativeGraphics,
   1122                                                      brush->nativeBrush, x, y,
   1123                                                      width, height));
   1124     }
   1125 
   1126     // integer version
   1127     Status FillEllipse(IN const Brush* brush,
   1128                        IN const Rect& rect)
   1129     {
   1130         return FillEllipse(brush, rect.X, rect.Y, rect.Width, rect.Height);
   1131     }
   1132 
   1133     Status FillEllipse(IN const Brush* brush,
   1134                        IN INT x,
   1135                        IN INT y,
   1136                        IN INT width,
   1137                        IN INT height)
   1138     {
   1139         return SetStatus(DllExports::GdipFillEllipseI(nativeGraphics,
   1140                                                       brush->nativeBrush,
   1141                                                       x,
   1142                                                       y,
   1143                                                       width,
   1144                                                       height));
   1145     }
   1146 
   1147     // float version
   1148     Status FillPie(IN const Brush* brush,
   1149                    IN const RectF& rect,
   1150                    IN REAL startAngle,
   1151                    IN REAL sweepAngle)
   1152     {
   1153         return FillPie(brush, rect.X, rect.Y, rect.Width, rect.Height,
   1154                        startAngle, sweepAngle);
   1155     }
   1156 
   1157     Status FillPie(IN const Brush* brush,
   1158                    IN REAL x,
   1159                    IN REAL y,
   1160                    IN REAL width,
   1161                    IN REAL height,
   1162                    IN REAL startAngle,
   1163                    IN REAL sweepAngle)
   1164     {
   1165         return SetStatus(DllExports::GdipFillPie(nativeGraphics,
   1166                                                  brush->nativeBrush, x, y,
   1167                                                  width, height, startAngle,
   1168                                                  sweepAngle));
   1169     }
   1170 
   1171     // integer version
   1172     Status FillPie(IN const Brush* brush,
   1173                    IN const Rect& rect,
   1174                    IN REAL startAngle,
   1175                    IN REAL sweepAngle)
   1176     {
   1177         return FillPie(brush, rect.X, rect.Y, rect.Width, rect.Height,
   1178                        startAngle, sweepAngle);
   1179     }
   1180 
   1181     Status FillPie(IN const Brush* brush,
   1182                    IN INT x,
   1183                    IN INT y,
   1184                    IN INT width,
   1185                    IN INT height,
   1186                    IN REAL startAngle,
   1187                    IN REAL sweepAngle)
   1188     {
   1189         return SetStatus(DllExports::GdipFillPieI(nativeGraphics,
   1190                                                   brush->nativeBrush,
   1191                                                   x,
   1192                                                   y,
   1193                                                   width,
   1194                                                   height,
   1195                                                   startAngle,
   1196                                                   sweepAngle));
   1197     }
   1198 
   1199     Status FillPath(IN const Brush* brush,
   1200                     IN const GraphicsPath* path)
   1201     {
   1202         return SetStatus(DllExports::GdipFillPath(nativeGraphics,
   1203                                                   brush->nativeBrush,
   1204                                                   path->nativePath));
   1205     }
   1206 
   1207     // float version
   1208     Status FillClosedCurve(IN const Brush* brush,
   1209                            IN const PointF* points,
   1210                            IN INT count)
   1211     {
   1212         return SetStatus(DllExports::GdipFillClosedCurve(nativeGraphics,
   1213                                                          brush->nativeBrush,
   1214                                                          points, count));
   1215 
   1216     }
   1217 
   1218     Status FillClosedCurve(IN const Brush* brush,
   1219                            IN const PointF* points,
   1220                            IN INT count,
   1221                            IN FillMode fillMode,
   1222                            IN REAL tension = 0.5f)
   1223     {
   1224         return SetStatus(DllExports::GdipFillClosedCurve2(nativeGraphics,
   1225                                                           brush->nativeBrush,
   1226                                                           points, count,
   1227                                                           tension, fillMode));
   1228     }
   1229 
   1230     // integer version
   1231     Status FillClosedCurve(IN const Brush* brush,
   1232                            IN const Point* points,
   1233                            IN INT count)
   1234     {
   1235         return SetStatus(DllExports::GdipFillClosedCurveI(nativeGraphics,
   1236                                                           brush->nativeBrush,
   1237                                                           points,
   1238                                                           count));
   1239     }
   1240 
   1241     Status FillClosedCurve(IN const Brush* brush,
   1242                            IN const Point* points,
   1243                            IN INT count,
   1244                            IN FillMode fillMode,
   1245                            IN REAL tension = 0.5f)
   1246     {
   1247         return SetStatus(DllExports::GdipFillClosedCurve2I(nativeGraphics,
   1248                                                            brush->nativeBrush,
   1249                                                            points, count,
   1250                                                            tension, fillMode));
   1251     }
   1252 
   1253     // float version
   1254     Status FillRegion(IN const Brush* brush,
   1255                       IN const Region* region)
   1256     {
   1257         return SetStatus(DllExports::GdipFillRegion(nativeGraphics,
   1258                                                     brush->nativeBrush,
   1259                                                     region->nativeRegion));
   1260     }
   1261 
   1262     // DrawString and MeasureString
   1263     Status
   1264     DrawString(
   1265         IN const WCHAR        *string,
   1266         IN INT                 length,
   1267         IN const Font         *font,
   1268         IN const RectF        &layoutRect,
   1269         IN const StringFormat *stringFormat,
   1270         IN const Brush        *brush
   1271     )
   1272     {
   1273         return SetStatus(DllExports::GdipDrawString(
   1274             nativeGraphics,
   1275             string,
   1276             length,
   1277             font ? font->nativeFont : NULL,
   1278             &layoutRect,
   1279             stringFormat ? stringFormat->nativeFormat : NULL,
   1280             brush ? brush->nativeBrush : NULL
   1281         ));
   1282     }
   1283 
   1284     Status
   1285     DrawString(
   1286         const WCHAR        *string,
   1287         INT                 length,
   1288         const Font         *font,
   1289         const PointF       &origin,
   1290         const Brush        *brush
   1291     )
   1292     {
   1293         RectF rect(origin.X, origin.Y, 0.0f, 0.0f);
   1294 
   1295         return SetStatus(DllExports::GdipDrawString(
   1296             nativeGraphics,
   1297             string,
   1298             length,
   1299             font ? font->nativeFont : NULL,
   1300             &rect,
   1301             NULL,
   1302             brush ? brush->nativeBrush : NULL
   1303         ));
   1304     }
   1305 
   1306     Status
   1307     DrawString(
   1308         const WCHAR        *string,
   1309         INT                 length,
   1310         const Font         *font,
   1311         const PointF       &origin,
   1312         const StringFormat *stringFormat,
   1313         const Brush        *brush
   1314     )
   1315     {
   1316         RectF rect(origin.X, origin.Y, 0.0f, 0.0f);
   1317 
   1318         return SetStatus(DllExports::GdipDrawString(
   1319             nativeGraphics,
   1320             string,
   1321             length,
   1322             font ? font->nativeFont : NULL,
   1323             &rect,
   1324             stringFormat ? stringFormat->nativeFormat : NULL,
   1325             brush ? brush->nativeBrush : NULL
   1326         ));
   1327     }
   1328 
   1329     Status
   1330     MeasureString(
   1331         IN const WCHAR        *string,
   1332         IN INT                 length,
   1333         IN const Font         *font,
   1334         IN const RectF        &layoutRect,
   1335         IN const StringFormat *stringFormat,
   1336         OUT RectF             *boundingBox,
   1337         OUT INT               *codepointsFitted = 0,
   1338         OUT INT               *linesFilled      = 0
   1339     ) const
   1340     {
   1341         return SetStatus(DllExports::GdipMeasureString(
   1342             nativeGraphics,
   1343             string,
   1344             length,
   1345             font ? font->nativeFont : NULL,
   1346             &layoutRect,
   1347             stringFormat ? stringFormat->nativeFormat : NULL,
   1348             boundingBox,
   1349             codepointsFitted,
   1350             linesFilled
   1351         ));
   1352     }
   1353 
   1354     Status
   1355     MeasureString(
   1356         IN const WCHAR        *string,
   1357         IN INT                 length,
   1358         IN const Font         *font,
   1359         IN const SizeF        &layoutRectSize,
   1360         IN const StringFormat *stringFormat,
   1361         OUT SizeF             *size,
   1362         OUT INT               *codepointsFitted = 0,
   1363         OUT INT               *linesFilled      = 0
   1364     ) const
   1365     {
   1366         RectF   layoutRect(0, 0, layoutRectSize.Width, layoutRectSize.Height);
   1367         RectF   boundingBox;
   1368         Status  status;
   1369 
   1370         if (size == NULL)
   1371         {
   1372             return SetStatus(InvalidParameter);
   1373         }
   1374 
   1375         status = SetStatus(DllExports::GdipMeasureString(
   1376             nativeGraphics,
   1377             string,
   1378             length,
   1379             font ? font->nativeFont : NULL,
   1380             &layoutRect,
   1381             stringFormat ? stringFormat->nativeFormat : NULL,
   1382             size ? &boundingBox : NULL,
   1383             codepointsFitted,
   1384             linesFilled
   1385         ));
   1386 
   1387         if (size && status == Ok)
   1388         {
   1389             size->Width  = boundingBox.Width;
   1390             size->Height = boundingBox.Height;
   1391         }
   1392 
   1393         return status;
   1394     }
   1395 
   1396     Status
   1397     MeasureString(
   1398         IN const WCHAR        *string,
   1399         IN INT                 length,
   1400         IN const Font         *font,
   1401         IN const PointF       &origin,
   1402         IN const StringFormat *stringFormat,
   1403         OUT RectF             *boundingBox
   1404     ) const
   1405     {
   1406         RectF rect(origin.X, origin.Y, 0.0f, 0.0f);
   1407 
   1408         return SetStatus(DllExports::GdipMeasureString(
   1409             nativeGraphics,
   1410             string,
   1411             length,
   1412             font ? font->nativeFont : NULL,
   1413             &rect,
   1414             stringFormat ? stringFormat->nativeFormat : NULL,
   1415             boundingBox,
   1416             NULL,
   1417             NULL
   1418         ));
   1419     }
   1420 
   1421 
   1422     Status
   1423     MeasureString(
   1424         IN const WCHAR  *string,
   1425         IN INT           length,
   1426         IN const Font   *font,
   1427         IN const RectF  &layoutRect,
   1428         OUT RectF       *boundingBox
   1429     ) const
   1430     {
   1431         return SetStatus(DllExports::GdipMeasureString(
   1432             nativeGraphics,
   1433             string,
   1434             length,
   1435             font ? font->nativeFont : NULL,
   1436             &layoutRect,
   1437             NULL,
   1438             boundingBox,
   1439             NULL,
   1440             NULL
   1441         ));
   1442     }
   1443 
   1444     Status
   1445     MeasureString(
   1446         IN const WCHAR  *string,
   1447         IN INT           length,
   1448         IN const Font   *font,
   1449         IN const PointF &origin,
   1450         OUT RectF       *boundingBox
   1451     ) const
   1452     {
   1453         RectF rect(origin.X, origin.Y, 0.0f, 0.0f);
   1454 
   1455         return SetStatus(DllExports::GdipMeasureString(
   1456             nativeGraphics,
   1457             string,
   1458             length,
   1459             font ? font->nativeFont : NULL,
   1460             &rect,
   1461             NULL,
   1462             boundingBox,
   1463             NULL,
   1464             NULL
   1465         ));
   1466     }
   1467 
   1468 
   1469 #ifdef DCR_USE_NEW_174340
   1470     Status
   1471     MeasureCharacterRanges(
   1472         IN const WCHAR        *string,
   1473         IN INT                 length,
   1474         IN const Font         *font,
   1475         IN const RectF        &layoutRect,
   1476         IN const StringFormat *stringFormat,
   1477         IN INT                 regionCount,
   1478         OUT Region            *regions
   1479     ) const
   1480     {
   1481         if (!regions || regionCount <= 0)
   1482         {
   1483             return InvalidParameter;
   1484         }
   1485 
   1486         GpRegion **nativeRegions = new GpRegion* [regionCount];
   1487 
   1488         if (!nativeRegions)
   1489         {
   1490             return OutOfMemory;
   1491         }
   1492 
   1493         for (INT i = 0; i < regionCount; i++)
   1494         {
   1495             nativeRegions[i] = regions[i].nativeRegion;
   1496         }
   1497 
   1498         Status status = SetStatus(DllExports::GdipMeasureCharacterRanges(
   1499             nativeGraphics,
   1500             string,
   1501             length,
   1502             font ? font->nativeFont : NULL,
   1503             layoutRect,
   1504             stringFormat ? stringFormat->nativeFormat : NULL,
   1505             regionCount,
   1506             nativeRegions
   1507         ));
   1508 
   1509         delete [] nativeRegions;
   1510 
   1511         return status;
   1512     }
   1513 #endif
   1514 
   1515 
   1516 #ifndef DCR_USE_NEW_174340
   1517     Status
   1518     MeasureStringRegion(
   1519         IN const WCHAR        *string,
   1520         IN INT                 length,
   1521         IN const Font         *font,
   1522         IN const RectF        &layoutRect,
   1523         IN const StringFormat *stringFormat,
   1524         IN INT                 firstCharacterIndex,
   1525         IN INT                 characterCount,
   1526         OUT Region            *region
   1527     ) const
   1528     {
   1529         if (region == NULL)
   1530         {
   1531             return SetStatus(InvalidParameter);
   1532         }
   1533 
   1534         return (SetStatus(DllExports::GdipMeasureStringRegion(
   1535             nativeGraphics,
   1536             string,
   1537             length,
   1538             font ? font->nativeFont : NULL,
   1539             layoutRect,
   1540             stringFormat ? stringFormat->nativeFormat : NULL,
   1541             firstCharacterIndex,
   1542             characterCount,
   1543             region->nativeRegion)));
   1544     }
   1545 #endif
   1546 
   1547     Status DrawDriverString(
   1548         IN const UINT16  *text,
   1549         IN INT            length,
   1550         IN const Font    *font,
   1551         IN const Brush   *brush,
   1552         IN const PointF  *positions,
   1553         IN INT            flags,
   1554         IN const Matrix        *matrix
   1555     )
   1556     {
   1557         return SetStatus(DllExports::GdipDrawDriverString(
   1558             nativeGraphics,
   1559             text,
   1560             length,
   1561             font ? font->nativeFont : NULL,
   1562             brush ? brush->nativeBrush : NULL,
   1563             positions,
   1564             flags,
   1565             matrix ? matrix->nativeMatrix : NULL
   1566         ));
   1567     }
   1568 
   1569     Status MeasureDriverString(
   1570         IN const UINT16  *text,
   1571         IN INT            length,
   1572         IN const Font    *font,
   1573         IN const PointF  *positions,
   1574         IN INT            flags,
   1575         IN const Matrix        *matrix,
   1576         OUT RectF        *boundingBox
   1577     ) const
   1578     {
   1579         return SetStatus(DllExports::GdipMeasureDriverString(
   1580             nativeGraphics,
   1581             text,
   1582             length,
   1583             font ? font->nativeFont : NULL,
   1584             positions,
   1585             flags,
   1586             matrix ? matrix->nativeMatrix : NULL,
   1587             boundingBox
   1588         ));
   1589     }
   1590 
   1591 #ifndef DCR_USE_NEW_168772
   1592     Status DriverStringPointToCodepoint(
   1593         IN const UINT16  *text,
   1594         IN INT            length,
   1595         IN const Font    *font,
   1596         IN const PointF  *positions,
   1597         IN INT            flags,
   1598         IN const Matrix  *matrix,
   1599         IN const PointF  &hit,
   1600         OUT INT          *index,
   1601         OUT BOOL         *rightEdge,
   1602         OUT REAL         *distance
   1603     )
   1604     {
   1605         return SetStatus(DllExports::GdipDriverStringPointToCodepoint(
   1606             nativeGraphics,
   1607             text,
   1608             length,
   1609             font ? font->nativeFont : NULL,
   1610             positions,
   1611             flags,
   1612             matrix ? matrix->nativeMatrix : NULL,
   1613             &hit,
   1614             index,
   1615             rightEdge,
   1616             distance
   1617         ));
   1618     }
   1619 #endif
   1620 
   1621     // Draw a cached bitmap on this graphics destination offset by
   1622     // x, y. Note this will fail with WrongState if the CachedBitmap
   1623     // native format differs from this Graphics.
   1624 
   1625     Status DrawCachedBitmap(IN CachedBitmap *cb,
   1626                             IN INT x,
   1627                             IN INT y)
   1628     {
   1629         return SetStatus(DllExports::GdipDrawCachedBitmap(
   1630             nativeGraphics,
   1631             cb->nativeCachedBitmap,
   1632             x, y
   1633         ));
   1634     }
   1635 
   1636     /**
   1637      * Draw images (both bitmap and vector)
   1638      */
   1639     // float version
   1640     Status DrawImage(IN Image* image,
   1641                      IN const PointF& point)
   1642     {
   1643         return DrawImage(image, point.X, point.Y);
   1644     }
   1645 
   1646     Status DrawImage(IN Image* image,
   1647                      IN REAL x,
   1648                      IN REAL y)
   1649     {
   1650         return SetStatus(DllExports::GdipDrawImage(nativeGraphics,
   1651                                                    image ? image->nativeImage
   1652                                                          : NULL,
   1653                                                    x,
   1654                                                    y));
   1655     }
   1656 
   1657     Status DrawImage(IN Image* image,
   1658                      IN const RectF& rect)
   1659     {
   1660         return DrawImage(image, rect.X, rect.Y, rect.Width, rect.Height);
   1661     }
   1662 
   1663     Status DrawImage(IN Image* image,
   1664                      IN REAL x,
   1665                      IN REAL y,
   1666                      IN REAL width,
   1667                      IN REAL height)
   1668     {
   1669         return SetStatus(DllExports::GdipDrawImageRect(nativeGraphics,
   1670                                                        image ? image->nativeImage
   1671                                                              : NULL,
   1672                                                        x,
   1673                                                        y,
   1674                                                        width,
   1675                                                        height));
   1676     }
   1677 
   1678     // integer version
   1679     Status DrawImage(IN Image* image,
   1680                      IN const Point& point)
   1681     {
   1682         return DrawImage(image, point.X, point.Y);
   1683     }
   1684 
   1685     Status DrawImage(IN Image* image,
   1686                      IN INT x,
   1687                      IN INT y)
   1688     {
   1689         return SetStatus(DllExports::GdipDrawImageI(nativeGraphics,
   1690                                                     image ? image->nativeImage
   1691                                                           : NULL,
   1692                                                     x,
   1693                                                     y));
   1694     }
   1695 
   1696     Status DrawImage(IN Image* image,
   1697                      IN const Rect& rect)
   1698     {
   1699         return DrawImage(image,
   1700                          rect.X,
   1701                          rect.Y,
   1702                          rect.Width,
   1703                          rect.Height);
   1704     }
   1705 
   1706     Status DrawImage(IN Image* image,
   1707                      IN INT x,
   1708                      IN INT y,
   1709                      IN INT width,
   1710                      IN INT height) {
   1711         return SetStatus(DllExports::GdipDrawImageRectI(nativeGraphics,
   1712                                                         image ? image->nativeImage
   1713                                                               : NULL,
   1714                                                         x,
   1715                                                         y,
   1716                                                         width,
   1717                                                         height));
   1718     }
   1719 
   1720     /**
   1721      * Affine or perspective blt
   1722      *  destPoints.length = 3: rect => parallelogram
   1723      *      destPoints[0] <=> top-left corner of the source rectangle
   1724      *      destPoints[1] <=> top-right corner
   1725      *      destPoints[2] <=> bottom-left corner
   1726      *  destPoints.length = 4: rect => quad
   1727      *      destPoints[3] <=> bottom-right corner
   1728      *
   1729      *  @notes Perspective blt only works for bitmap images.
   1730      */
   1731     Status DrawImage(IN Image* image,
   1732                      IN const PointF* destPoints,
   1733                      IN INT count)
   1734     {
   1735         if (count != 3 && count != 4)
   1736             return SetStatus(InvalidParameter);
   1737 
   1738         return SetStatus(DllExports::GdipDrawImagePoints(nativeGraphics,
   1739                                                          image ? image->nativeImage
   1740                                                                : NULL,
   1741                                                          destPoints, count));
   1742     }
   1743 
   1744     Status DrawImage(IN Image* image,
   1745                      IN const Point* destPoints,
   1746                      IN INT count)
   1747     {
   1748         if (count != 3 && count != 4)
   1749             return SetStatus(InvalidParameter);
   1750 
   1751         return SetStatus(DllExports::GdipDrawImagePointsI(nativeGraphics,
   1752                                                           image ? image->nativeImage
   1753                                                                 : NULL,
   1754                                                           destPoints,
   1755                                                           count));
   1756     }
   1757 
   1758     /**
   1759      * We need another set of methods similar to the ones above
   1760      * that take an additional Rect parameter to specify the
   1761      * portion of the source image to be drawn.
   1762      */
   1763     // float version
   1764     Status DrawImage(IN Image* image,
   1765                      IN REAL x,
   1766                      IN REAL y,
   1767                      IN REAL srcx,
   1768                      IN REAL srcy,
   1769                      IN REAL srcwidth,
   1770                      IN REAL srcheight,
   1771                      IN Unit srcUnit)
   1772     {
   1773         return SetStatus(DllExports::GdipDrawImagePointRect(nativeGraphics,
   1774                                                             image ? image->nativeImage
   1775                                                                   : NULL,
   1776                                                             x, y,
   1777                                                             srcx, srcy,
   1778                                                             srcwidth, srcheight, srcUnit));
   1779     }
   1780 
   1781     Status DrawImage(IN Image* image,
   1782                      IN const RectF& destRect,
   1783                      IN REAL srcx,
   1784                      IN REAL srcy,
   1785                      IN REAL srcwidth,
   1786                      IN REAL srcheight,
   1787                      IN Unit srcUnit,
   1788                      IN const ImageAttributes* imageAttributes = NULL,
   1789                      IN DrawImageAbort callback = NULL,
   1790                      IN VOID* callbackData = NULL)
   1791     {
   1792         return SetStatus(DllExports::GdipDrawImageRectRect(nativeGraphics,
   1793                                                            image ? image->nativeImage
   1794                                                                  : NULL,
   1795                                                            destRect.X,
   1796                                                            destRect.Y,
   1797                                                            destRect.Width,
   1798                                                            destRect.Height,
   1799                                                            srcx, srcy,
   1800                                                            srcwidth, srcheight,
   1801                                                            srcUnit,
   1802                                                            imageAttributes
   1803                                                             ? imageAttributes->nativeImageAttr
   1804                                                             : NULL,
   1805                                                            callback,
   1806                                                            callbackData));
   1807     }
   1808 
   1809     Status DrawImage(IN Image* image,
   1810                      IN const PointF* destPoints,
   1811                      IN INT count,
   1812                      IN REAL srcx,
   1813                      IN REAL srcy,
   1814                      IN REAL srcwidth,
   1815                      IN REAL srcheight,
   1816                      IN Unit srcUnit,
   1817                      IN const ImageAttributes* imageAttributes = NULL,
   1818                      IN DrawImageAbort callback = NULL,
   1819                      IN VOID* callbackData = NULL)
   1820     {
   1821         return SetStatus(DllExports::GdipDrawImagePointsRect(nativeGraphics,
   1822                                                              image ? image->nativeImage
   1823                                                                    : NULL,
   1824                                                              destPoints, count,
   1825                                                              srcx, srcy,
   1826                                                              srcwidth,
   1827                                                              srcheight,
   1828                                                              srcUnit,
   1829                                                              imageAttributes
   1830                                                               ? imageAttributes->nativeImageAttr
   1831                                                               : NULL,
   1832                                                              callback,
   1833                                                              callbackData));
   1834     }
   1835 
   1836     // integer version
   1837     Status DrawImage(IN Image* image,
   1838                      IN INT x,
   1839                      IN INT y,
   1840                      IN INT srcx,
   1841                      IN INT srcy,
   1842                      IN INT srcwidth,
   1843                      IN INT srcheight,
   1844                      IN Unit srcUnit)
   1845     {
   1846         return SetStatus(DllExports::GdipDrawImagePointRectI(nativeGraphics,
   1847                                                              image ? image->nativeImage
   1848                                                                    : NULL,
   1849                                                              x,
   1850                                                              y,
   1851                                                              srcx,
   1852                                                              srcy,
   1853                                                              srcwidth,
   1854                                                              srcheight,
   1855                                                              srcUnit));
   1856     }
   1857 
   1858     Status DrawImage(IN Image* image,
   1859                      IN const Rect& destRect,
   1860                      IN INT srcx,
   1861                      IN INT srcy,
   1862                      IN INT srcwidth,
   1863                      IN INT srcheight,
   1864                      IN Unit srcUnit,
   1865                      IN const ImageAttributes* imageAttributes = NULL,
   1866                      IN DrawImageAbort callback = NULL,
   1867                      IN VOID* callbackData = NULL)
   1868     {
   1869         return SetStatus(DllExports::GdipDrawImageRectRectI(nativeGraphics,
   1870                                                             image ? image->nativeImage
   1871                                                                   : NULL,
   1872                                                             destRect.X,
   1873                                                             destRect.Y,
   1874                                                             destRect.Width,
   1875                                                             destRect.Height,
   1876                                                             srcx,
   1877                                                             srcy,
   1878                                                             srcwidth,
   1879                                                             srcheight,
   1880                                                             srcUnit,
   1881                                                             imageAttributes
   1882                                                             ? imageAttributes->nativeImageAttr
   1883                                                             : NULL,
   1884                                                             callback,
   1885                                                             callbackData));
   1886     }
   1887 
   1888     Status DrawImage(IN Image* image,
   1889                      IN const Point* destPoints,
   1890                      IN INT count,
   1891                      IN INT srcx,
   1892                      IN INT srcy,
   1893                      IN INT srcwidth,
   1894                      IN INT srcheight,
   1895                      IN Unit srcUnit,
   1896                      IN const ImageAttributes* imageAttributes = NULL,
   1897                      IN DrawImageAbort callback = NULL,
   1898                      IN VOID* callbackData = NULL)
   1899     {
   1900         return SetStatus(DllExports::GdipDrawImagePointsRectI(nativeGraphics,
   1901                                                               image ? image->nativeImage
   1902                                                                     : NULL,
   1903                                                               destPoints,
   1904                                                               count,
   1905                                                               srcx,
   1906                                                               srcy,
   1907                                                               srcwidth,
   1908                                                               srcheight,
   1909                                                               srcUnit,
   1910                                                               imageAttributes
   1911                                                                ? imageAttributes->nativeImageAttr
   1912                                                                : NULL,
   1913                                                               callback,
   1914                                                               callbackData));
   1915     }
   1916 
   1917     // The following methods are for playing an EMF+ to a graphics
   1918     // via the enumeration interface.  Each record of the EMF+ is
   1919     // sent to the callback (along with the callbackData).  Then
   1920     // the callback can invoke the Metafile::PlayRecord method
   1921     // to play the particular record.
   1922 
   1923     Status
   1924     EnumerateMetafile(
   1925         IN const Metafile *        metafile,
   1926         IN const PointF &          destPoint,
   1927         IN EnumerateMetafileProc   callback,
   1928         IN VOID *                  callbackData    = NULL,
   1929         IN const ImageAttributes *       imageAttributes = NULL
   1930         )
   1931     {
   1932         return SetStatus(DllExports::GdipEnumerateMetafileDestPoint(
   1933                     nativeGraphics,
   1934                     (const GpMetafile *)(metafile ? metafile->nativeImage:NULL),
   1935                     destPoint,
   1936                     callback,
   1937                     callbackData,
   1938                     imageAttributes ? imageAttributes->nativeImageAttr : NULL));
   1939     }
   1940 
   1941     Status
   1942     EnumerateMetafile(
   1943         IN const Metafile *        metafile,
   1944         IN const Point &           destPoint,
   1945         IN EnumerateMetafileProc   callback,
   1946         IN VOID *                  callbackData    = NULL,
   1947         IN const ImageAttributes *       imageAttributes = NULL
   1948         )
   1949     {
   1950         return SetStatus(DllExports::GdipEnumerateMetafileDestPointI(
   1951                     nativeGraphics,
   1952                     (const GpMetafile *)(metafile ? metafile->nativeImage:NULL),
   1953                     destPoint,
   1954                     callback,
   1955                     callbackData,
   1956                     imageAttributes ? imageAttributes->nativeImageAttr : NULL));
   1957     }
   1958 
   1959     Status
   1960     EnumerateMetafile(
   1961         IN const Metafile *        metafile,
   1962         IN const RectF &           destRect,
   1963         IN EnumerateMetafileProc   callback,
   1964         IN VOID *                  callbackData    = NULL,
   1965         IN const ImageAttributes *       imageAttributes = NULL
   1966         )
   1967     {
   1968         return SetStatus(DllExports::GdipEnumerateMetafileDestRect(
   1969                     nativeGraphics,
   1970                     (const GpMetafile *)(metafile ? metafile->nativeImage:NULL),
   1971                     destRect,
   1972                     callback,
   1973                     callbackData,
   1974                     imageAttributes ? imageAttributes->nativeImageAttr : NULL));
   1975     }
   1976 
   1977     Status
   1978     EnumerateMetafile(
   1979         IN const Metafile *        metafile,
   1980         IN const Rect &            destRect,
   1981         IN EnumerateMetafileProc   callback,
   1982         IN VOID *                  callbackData    = NULL,
   1983         IN const ImageAttributes *       imageAttributes = NULL
   1984         )
   1985     {
   1986         return SetStatus(DllExports::GdipEnumerateMetafileDestRectI(
   1987                     nativeGraphics,
   1988                     (const GpMetafile *)(metafile ? metafile->nativeImage:NULL),
   1989                     destRect,
   1990                     callback,
   1991                     callbackData,
   1992                     imageAttributes ? imageAttributes->nativeImageAttr : NULL));
   1993     }
   1994 
   1995     Status
   1996     EnumerateMetafile(
   1997         IN const Metafile *        metafile,
   1998         IN const PointF *          destPoints,
   1999         IN INT                     count,
   2000         IN EnumerateMetafileProc   callback,
   2001         IN VOID *                  callbackData    = NULL,
   2002         IN const ImageAttributes *       imageAttributes = NULL
   2003         )
   2004     {
   2005         return SetStatus(DllExports::GdipEnumerateMetafileDestPoints(
   2006                     nativeGraphics,
   2007                     (const GpMetafile *)(metafile ? metafile->nativeImage:NULL),
   2008                     destPoints,
   2009                     count,
   2010                     callback,
   2011                     callbackData,
   2012                     imageAttributes ? imageAttributes->nativeImageAttr : NULL));
   2013     }
   2014 
   2015     Status
   2016     EnumerateMetafile(
   2017         IN const Metafile *        metafile,
   2018         IN const Point *           destPoints,
   2019         IN INT                     count,
   2020         IN EnumerateMetafileProc   callback,
   2021         IN VOID *                  callbackData    = NULL,
   2022         IN const ImageAttributes *       imageAttributes = NULL
   2023         )
   2024     {
   2025         return SetStatus(DllExports::GdipEnumerateMetafileDestPointsI(
   2026                     nativeGraphics,
   2027                     (const GpMetafile *)(metafile ? metafile->nativeImage:NULL),
   2028                     destPoints,
   2029                     count,
   2030                     callback,
   2031                     callbackData,
   2032                     imageAttributes ? imageAttributes->nativeImageAttr : NULL));
   2033     }
   2034 
   2035     Status
   2036     EnumerateMetafile(
   2037         IN const Metafile *        metafile,
   2038         IN const PointF &          destPoint,
   2039         IN const RectF &           srcRect,
   2040         IN Unit                    srcUnit,
   2041         IN EnumerateMetafileProc   callback,
   2042         IN VOID *                  callbackData    = NULL,
   2043         IN const ImageAttributes *       imageAttributes = NULL
   2044         )
   2045     {
   2046         return SetStatus(DllExports::GdipEnumerateMetafileSrcRectDestPoint(
   2047                     nativeGraphics,
   2048                     (const GpMetafile *)(metafile ? metafile->nativeImage:NULL),
   2049                     destPoint,
   2050                     srcRect,
   2051                     srcUnit,
   2052                     callback,
   2053                     callbackData,
   2054                     imageAttributes ? imageAttributes->nativeImageAttr : NULL));
   2055     }
   2056 
   2057     Status
   2058     EnumerateMetafile(
   2059         IN const Metafile *        metafile,
   2060         IN const Point &           destPoint,
   2061         IN const Rect &            srcRect,
   2062         IN Unit                    srcUnit,
   2063         IN EnumerateMetafileProc   callback,
   2064         IN VOID *                  callbackData    = NULL,
   2065         IN const ImageAttributes *       imageAttributes = NULL
   2066         )
   2067     {
   2068         return SetStatus(DllExports::GdipEnumerateMetafileSrcRectDestPointI(
   2069                     nativeGraphics,
   2070                     (const GpMetafile *)(metafile ? metafile->nativeImage:NULL),
   2071                     destPoint,
   2072                     srcRect,
   2073                     srcUnit,
   2074                     callback,
   2075                     callbackData,
   2076                     imageAttributes ? imageAttributes->nativeImageAttr : NULL));
   2077     }
   2078 
   2079     Status
   2080     EnumerateMetafile(
   2081         IN const Metafile *        metafile,
   2082         IN const RectF &           destRect,
   2083         IN const RectF &           srcRect,
   2084         IN Unit                    srcUnit,
   2085         IN EnumerateMetafileProc   callback,
   2086         IN VOID *                  callbackData    = NULL,
   2087         IN const ImageAttributes *       imageAttributes = NULL
   2088         )
   2089     {
   2090         return SetStatus(DllExports::GdipEnumerateMetafileSrcRectDestRect(
   2091                     nativeGraphics,
   2092                     (const GpMetafile *)(metafile ? metafile->nativeImage:NULL),
   2093                     destRect,
   2094                     srcRect,
   2095                     srcUnit,
   2096                     callback,
   2097                     callbackData,
   2098                     imageAttributes ? imageAttributes->nativeImageAttr : NULL));
   2099     }
   2100 
   2101     Status
   2102     EnumerateMetafile(
   2103         IN const Metafile *        metafile,
   2104         IN const Rect &            destRect,
   2105         IN const Rect &            srcRect,
   2106         IN Unit                    srcUnit,
   2107         IN EnumerateMetafileProc   callback,
   2108         IN VOID *                  callbackData    = NULL,
   2109         IN const ImageAttributes *       imageAttributes = NULL
   2110         )
   2111     {
   2112         return SetStatus(DllExports::GdipEnumerateMetafileSrcRectDestRectI(
   2113                     nativeGraphics,
   2114                     (const GpMetafile *)(metafile ? metafile->nativeImage:NULL),
   2115                     destRect,
   2116                     srcRect,
   2117                     srcUnit,
   2118                     callback,
   2119                     callbackData,
   2120                     imageAttributes ? imageAttributes->nativeImageAttr : NULL));
   2121     }
   2122 
   2123     Status
   2124     EnumerateMetafile(
   2125         IN const Metafile *        metafile,
   2126         IN const PointF *          destPoints,
   2127         IN INT                     count,
   2128         IN const RectF &           srcRect,
   2129         IN Unit                    srcUnit,
   2130         IN EnumerateMetafileProc   callback,
   2131         IN VOID *                  callbackData    = NULL,
   2132         IN const ImageAttributes *       imageAttributes = NULL
   2133         )
   2134     {
   2135         return SetStatus(DllExports::GdipEnumerateMetafileSrcRectDestPoints(
   2136                     nativeGraphics,
   2137                     (const GpMetafile *)(metafile ? metafile->nativeImage:NULL),
   2138                     destPoints,
   2139                     count,
   2140                     srcRect,
   2141                     srcUnit,
   2142                     callback,
   2143                     callbackData,
   2144                     imageAttributes ? imageAttributes->nativeImageAttr : NULL));
   2145     }
   2146 
   2147     Status
   2148     EnumerateMetafile(
   2149         IN const Metafile *        metafile,
   2150         IN const Point *           destPoints,
   2151         IN INT                     count,
   2152         IN const Rect &            srcRect,
   2153         IN Unit                    srcUnit,
   2154         IN EnumerateMetafileProc   callback,
   2155         IN VOID *                  callbackData    = NULL,
   2156         IN const ImageAttributes *       imageAttributes = NULL
   2157         )
   2158     {
   2159         return SetStatus(DllExports::GdipEnumerateMetafileSrcRectDestPointsI(
   2160                     nativeGraphics,
   2161                     (const GpMetafile *)(metafile ? metafile->nativeImage:NULL),
   2162                     destPoints,
   2163                     count,
   2164                     srcRect,
   2165                     srcUnit,
   2166                     callback,
   2167                     callbackData,
   2168                     imageAttributes ? imageAttributes->nativeImageAttr : NULL));
   2169     }
   2170 
   2171     /**
   2172       * Clipping region operations
   2173       *
   2174       * @notes Simply incredible redundancy here.
   2175       */
   2176     Status SetClip(IN const Graphics* g,
   2177                    IN CombineMode combineMode = CombineModeReplace)
   2178     {
   2179         return SetStatus(DllExports::GdipSetClipGraphics(nativeGraphics,
   2180                                                          g->nativeGraphics,
   2181                                                          combineMode));
   2182     }
   2183 
   2184     Status SetClip(IN const RectF& rect,
   2185                    IN CombineMode combineMode = CombineModeReplace)
   2186     {
   2187         return SetStatus(DllExports::GdipSetClipRect(nativeGraphics,
   2188                                                      rect.X, rect.Y,
   2189                                                      rect.Width, rect.Height,
   2190                                                      combineMode));
   2191     }
   2192 
   2193     Status SetClip(IN const Rect& rect,
   2194                    IN CombineMode combineMode = CombineModeReplace)
   2195     {
   2196         return SetStatus(DllExports::GdipSetClipRectI(nativeGraphics,
   2197                                                       rect.X, rect.Y,
   2198                                                       rect.Width, rect.Height,
   2199                                                       combineMode));
   2200     }
   2201 
   2202     Status SetClip(IN const GraphicsPath* path,
   2203                    IN CombineMode combineMode = CombineModeReplace)
   2204     {
   2205         return SetStatus(DllExports::GdipSetClipPath(nativeGraphics,
   2206                                                      path->nativePath,
   2207                                                      combineMode));
   2208     }
   2209 
   2210     Status SetClip(IN const Region* region,
   2211                    IN CombineMode combineMode = CombineModeReplace)
   2212     {
   2213         return SetStatus(DllExports::GdipSetClipRegion(nativeGraphics,
   2214                                                        region->nativeRegion,
   2215                                                        combineMode));
   2216     }
   2217 
   2218     // This is different than the other SetClip methods because it assumes
   2219     // that the HRGN is already in device units, so it doesn't transform
   2220     // the coordinates in the HRGN.
   2221     Status SetClip(IN HRGN hRgn,
   2222                    IN CombineMode combineMode = CombineModeReplace)
   2223     {
   2224         return SetStatus(DllExports::GdipSetClipHrgn(nativeGraphics, hRgn,
   2225                                                      combineMode));
   2226     }
   2227 
   2228     Status IntersectClip(IN const RectF& rect)
   2229     {
   2230         return SetStatus(DllExports::GdipSetClipRect(nativeGraphics,
   2231                                                      rect.X, rect.Y,
   2232                                                      rect.Width, rect.Height,
   2233                                                      CombineModeIntersect));
   2234     }
   2235 
   2236     Status IntersectClip(IN const Rect& rect)
   2237     {
   2238         return SetStatus(DllExports::GdipSetClipRectI(nativeGraphics,
   2239                                                       rect.X, rect.Y,
   2240                                                       rect.Width, rect.Height,
   2241                                                       CombineModeIntersect));
   2242     }
   2243 
   2244     Status IntersectClip(IN const Region* region)
   2245     {
   2246         return SetStatus(DllExports::GdipSetClipRegion(nativeGraphics,
   2247                                                        region->nativeRegion,
   2248                                                        CombineModeIntersect));
   2249     }
   2250 
   2251     Status ExcludeClip(IN const RectF& rect)
   2252     {
   2253         return SetStatus(DllExports::GdipSetClipRect(nativeGraphics,
   2254                                                      rect.X, rect.Y,
   2255                                                      rect.Width, rect.Height,
   2256                                                      CombineModeExclude));
   2257     }
   2258 
   2259     Status ExcludeClip(IN const Rect& rect)
   2260     {
   2261         return SetStatus(DllExports::GdipSetClipRectI(nativeGraphics,
   2262                                                       rect.X, rect.Y,
   2263                                                       rect.Width, rect.Height,
   2264                                                       CombineModeExclude));
   2265     }
   2266 
   2267     Status ExcludeClip(IN const Region* region)
   2268     {
   2269         return SetStatus(DllExports::GdipSetClipRegion(nativeGraphics,
   2270                                                        region->nativeRegion,
   2271                                                        CombineModeExclude));
   2272     }
   2273 
   2274     Status ResetClip()
   2275     {
   2276         return SetStatus(DllExports::GdipResetClip(nativeGraphics));
   2277     }
   2278 
   2279     Status TranslateClip(IN REAL dx,
   2280                          IN REAL dy)
   2281     {
   2282         return SetStatus(DllExports::GdipTranslateClip(nativeGraphics, dx, dy));
   2283     }
   2284 
   2285     Status TranslateClip(IN INT dx,
   2286                          IN INT dy)
   2287     {
   2288         return SetStatus(DllExports::GdipTranslateClipI(nativeGraphics,
   2289                                                         dx, dy));
   2290     }
   2291 
   2292     /**
   2293      *  GetClip region from graphics context
   2294      */
   2295     Status GetClip(OUT Region* region) const
   2296     {
   2297         return SetStatus(DllExports::GdipGetClip(nativeGraphics,
   2298                                                  region->nativeRegion));
   2299     }
   2300 
   2301     /**
   2302      * Hit testing operations
   2303      */
   2304     Status GetClipBounds(OUT RectF* rect) const
   2305     {
   2306         return SetStatus(DllExports::GdipGetClipBounds(nativeGraphics, rect));
   2307     }
   2308 
   2309     Status GetClipBounds(OUT Rect* rect) const
   2310     {
   2311         return SetStatus(DllExports::GdipGetClipBoundsI(nativeGraphics, rect));
   2312     }
   2313 
   2314     BOOL IsClipEmpty() const
   2315     {
   2316         BOOL booln = FALSE;
   2317 
   2318         SetStatus(DllExports::GdipIsClipEmpty(nativeGraphics, &booln));
   2319 
   2320         return booln;
   2321     }
   2322 
   2323     Status GetVisibleClipBounds(OUT RectF *rect) const
   2324     {
   2325 
   2326         return SetStatus(DllExports::GdipGetVisibleClipBounds(nativeGraphics,
   2327                                                               rect));
   2328     }
   2329 
   2330     Status GetVisibleClipBounds(OUT Rect *rect) const
   2331     {
   2332        return SetStatus(DllExports::GdipGetVisibleClipBoundsI(nativeGraphics,
   2333                                                               rect));
   2334     }
   2335 
   2336     BOOL IsVisibleClipEmpty() const
   2337     {
   2338         BOOL booln = FALSE;
   2339 
   2340         SetStatus(DllExports::GdipIsVisibleClipEmpty(nativeGraphics, &booln));
   2341 
   2342         return booln;
   2343     }
   2344 
   2345     BOOL IsVisible(IN INT x,
   2346                    IN INT y) const
   2347     {
   2348         return IsVisible(Point(x,y));
   2349     }
   2350 
   2351     BOOL IsVisible(IN const Point& point) const
   2352     {
   2353         BOOL booln = FALSE;
   2354 
   2355         SetStatus(DllExports::GdipIsVisiblePointI(nativeGraphics,
   2356                                                   point.X,
   2357                                                   point.Y,
   2358                                                   &booln));
   2359 
   2360         return booln;
   2361     }
   2362 
   2363     BOOL IsVisible(IN INT x,
   2364                    IN INT y,
   2365                    IN INT width,
   2366                    IN INT height) const
   2367     {
   2368         return IsVisible(Rect(x, y, width, height));
   2369     }
   2370 
   2371     BOOL IsVisible(IN const Rect& rect) const
   2372     {
   2373 
   2374         BOOL booln = TRUE;
   2375 
   2376         SetStatus(DllExports::GdipIsVisibleRectI(nativeGraphics,
   2377                                                  rect.X,
   2378                                                  rect.Y,
   2379                                                  rect.Width,
   2380                                                  rect.Height,
   2381                                                  &booln));
   2382         return booln;
   2383     }
   2384 
   2385     BOOL IsVisible(IN REAL x,
   2386                    IN REAL y) const
   2387     {
   2388         return IsVisible(PointF(x, y));
   2389     }
   2390 
   2391     BOOL IsVisible(IN const PointF& point) const
   2392     {
   2393         BOOL booln = FALSE;
   2394 
   2395         SetStatus(DllExports::GdipIsVisiblePoint(nativeGraphics,
   2396                                                  point.X,
   2397                                                  point.Y,
   2398                                                  &booln));
   2399 
   2400         return booln;
   2401     }
   2402 
   2403     BOOL IsVisible(IN REAL x,
   2404                    IN REAL y,
   2405                    IN REAL width,
   2406                    IN REAL height) const
   2407     {
   2408         return IsVisible(RectF(x, y, width, height));
   2409     }
   2410 
   2411     BOOL IsVisible(IN const RectF& rect) const
   2412     {
   2413         BOOL booln = TRUE;
   2414 
   2415         SetStatus(DllExports::GdipIsVisibleRect(nativeGraphics,
   2416                                                 rect.X,
   2417                                                 rect.Y,
   2418                                                 rect.Width,
   2419                                                 rect.Height,
   2420                                                 &booln));
   2421         return booln;
   2422     }
   2423 
   2424     /**
   2425      * Save/restore graphics state
   2426      */
   2427     GraphicsState Save() const
   2428     {
   2429         GraphicsState gstate;
   2430 
   2431         SetStatus(DllExports::GdipSaveGraphics(nativeGraphics, &gstate));
   2432 
   2433         return gstate;
   2434     }
   2435 
   2436     Status Restore(IN GraphicsState gstate)
   2437     {
   2438         return SetStatus(DllExports::GdipRestoreGraphics(nativeGraphics,
   2439                                                          gstate));
   2440     }
   2441 
   2442     /**
   2443      * Begin and end container drawing
   2444      */
   2445     GraphicsContainer BeginContainer(IN const RectF &dstrect,
   2446                                      IN const RectF &srcrect,
   2447                                      IN Unit         unit)
   2448     {
   2449         GraphicsContainer state;
   2450 
   2451         SetStatus(DllExports::GdipBeginContainer(nativeGraphics, &dstrect,
   2452                                                  &srcrect, unit, &state));
   2453 
   2454         return state;
   2455     }
   2456 
   2457     /**
   2458      * Begin and end container drawing
   2459      */
   2460     GraphicsContainer BeginContainer(IN const Rect    &dstrect,
   2461                                      IN const Rect    &srcrect,
   2462                                      IN Unit           unit)
   2463     {
   2464         GraphicsContainer state;
   2465 
   2466         SetStatus(DllExports::GdipBeginContainerI(nativeGraphics, &dstrect,
   2467                                                   &srcrect, unit, &state));
   2468 
   2469         return state;
   2470     }
   2471 
   2472     GraphicsContainer BeginContainer()
   2473     {
   2474         GraphicsContainer state;
   2475 
   2476         SetStatus(DllExports::GdipBeginContainer2(nativeGraphics, &state));
   2477 
   2478         return state;
   2479     }
   2480 
   2481     Status EndContainer(IN GraphicsContainer state)
   2482     {
   2483         return SetStatus(DllExports::GdipEndContainer(nativeGraphics, state));
   2484     }
   2485 
   2486     // only valid when recording metafiles
   2487     Status AddMetafileComment(IN const BYTE * data,
   2488                               IN UINT sizeData)
   2489     {
   2490         return SetStatus(DllExports::GdipComment(nativeGraphics, sizeData, data));
   2491     }
   2492 
   2493     /**
   2494      * Get/SetLayout
   2495      * Support for Middle East localization (right-to-left mirroring)
   2496      */
   2497     GraphicsLayout GetLayout() const
   2498     {
   2499         GraphicsLayout layout;
   2500 
   2501         SetStatus(DllExports::GdipGetGraphicsLayout(nativeGraphics, &layout));
   2502 
   2503         return layout;
   2504     }
   2505 
   2506     Status SetLayout(IN const GraphicsLayout layout)
   2507     {
   2508         return SetStatus(
   2509             DllExports::GdipSetGraphicsLayout(nativeGraphics, layout)
   2510         );
   2511     }
   2512 
   2513     static HPALETTE GetHalftonePalette()
   2514     {
   2515         return DllExports::GdipCreateHalftonePalette();
   2516     }
   2517 
   2518     Status GetLastStatus() const
   2519     {
   2520         Status lastStatus = lastResult;
   2521         lastResult = Ok;
   2522 
   2523         return lastStatus;
   2524     }
   2525 
   2526 protected:
   2527 
   2528 #ifdef DCR_USE_NEW_250932
   2529 
   2530 private:
   2531     Graphics(const Graphics &);
   2532     Graphics& operator=(const Graphics &);
   2533 protected:
   2534 
   2535 #else
   2536 
   2537     Graphics(const Graphics& graphics)
   2538     {
   2539         graphics;
   2540         SetStatus(NotImplemented);
   2541     }
   2542 
   2543     Graphics& operator=(const Graphics& graphics)
   2544     {
   2545         graphics;
   2546         SetStatus(NotImplemented);
   2547         return *this;
   2548     }
   2549 
   2550 #endif
   2551 
   2552     Graphics(GpGraphics* graphics)
   2553     {
   2554         lastResult = Ok;
   2555         SetNativeGraphics(graphics);
   2556     }
   2557 
   2558     VOID SetNativeGraphics(GpGraphics *graphics)
   2559     {
   2560         this->nativeGraphics = graphics;
   2561     }
   2562 
   2563     Status SetStatus(Status status) const
   2564     {
   2565         if (status != Ok)
   2566             return (lastResult = status);
   2567         else
   2568             return status;
   2569     }
   2570 
   2571     // Methods necessary to subclass Graphics for extension test.
   2572 
   2573     GpGraphics* GetNativeGraphics() const
   2574     {
   2575         return this->nativeGraphics;
   2576     }
   2577 
   2578     GpPen* GetNativePen(const Pen* pen)
   2579     {
   2580         return pen->nativePen;
   2581     }
   2582 
   2583 protected:
   2584     GpGraphics* nativeGraphics;
   2585     mutable Status lastResult;
   2586 
   2587 };
   2588 
   2589 //----------------------------------------------------------------------------
   2590 // Extra implementation of GraphicsPath methods that use Graphics
   2591 //----------------------------------------------------------------------------
   2592 
   2593 /**
   2594  * Get the bounds of the path object with the given transform.
   2595  * This is not always the tightest bounds.
   2596  */
   2597 
   2598 inline Status
   2599 GraphicsPath::GetBounds(
   2600     OUT RectF* bounds,
   2601     IN const Matrix* matrix,
   2602     IN const Pen* pen) const
   2603 {
   2604     GpMatrix* nativeMatrix = NULL;
   2605     GpPen* nativePen = NULL;
   2606 
   2607     if (matrix)
   2608         nativeMatrix = matrix->nativeMatrix;
   2609 
   2610     if (pen)
   2611         nativePen = pen->nativePen;
   2612 
   2613     return SetStatus(DllExports::GdipGetPathWorldBounds(nativePath, bounds,
   2614                                                    nativeMatrix, nativePen));
   2615 }
   2616 
   2617 // integer version
   2618 inline Status
   2619 GraphicsPath::GetBounds(
   2620     OUT Rect* bounds,
   2621     IN const Matrix* matrix,
   2622     IN const Pen* pen
   2623 ) const
   2624 {
   2625     GpMatrix* nativeMatrix = NULL;
   2626     GpPen* nativePen = NULL;
   2627 
   2628     if (matrix)
   2629         nativeMatrix = matrix->nativeMatrix;
   2630 
   2631     if (pen)
   2632         nativePen = pen->nativePen;
   2633 
   2634     return SetStatus(DllExports::GdipGetPathWorldBoundsI(nativePath, bounds,
   2635                                                     nativeMatrix, nativePen));
   2636 }
   2637 
   2638 //----------------------------------------------------------------------------
   2639 // Hit testing operations
   2640 //----------------------------------------------------------------------------
   2641 
   2642 inline BOOL
   2643 GraphicsPath::IsVisible(
   2644     IN REAL x,
   2645     IN REAL y,
   2646     IN const Graphics* g) const
   2647 {
   2648    BOOL booln = FALSE;
   2649 
   2650    GpGraphics* nativeGraphics = NULL;
   2651 
   2652    if (g)
   2653        nativeGraphics = g->nativeGraphics;
   2654 
   2655    SetStatus(DllExports::GdipIsVisiblePathPoint(nativePath,
   2656                                                 x, y, nativeGraphics,
   2657                                                 &booln));
   2658    return booln;
   2659 }
   2660 
   2661 inline BOOL
   2662 GraphicsPath::IsVisible(
   2663     IN INT x,
   2664     IN INT y,
   2665     IN const Graphics* g) const
   2666 {
   2667    BOOL booln = FALSE;
   2668 
   2669    GpGraphics* nativeGraphics = NULL;
   2670 
   2671    if (g)
   2672        nativeGraphics = g->nativeGraphics;
   2673 
   2674    SetStatus(DllExports::GdipIsVisiblePathPointI(nativePath,
   2675                                                  x, y, nativeGraphics,
   2676                                                  &booln));
   2677    return booln;
   2678 }
   2679 
   2680 inline BOOL
   2681 GraphicsPath::IsOutlineVisible(
   2682     IN REAL x,
   2683     IN REAL y,
   2684     IN const Pen* pen,
   2685     IN const Graphics* g) const
   2686 {
   2687     BOOL booln = FALSE;
   2688 
   2689     GpGraphics* nativeGraphics = NULL;
   2690     GpPen* nativePen = NULL;
   2691 
   2692     if(g)
   2693         nativeGraphics = g->nativeGraphics;
   2694     if(pen)
   2695         nativePen = pen->nativePen;
   2696 
   2697     SetStatus(DllExports::GdipIsOutlineVisiblePathPoint(nativePath,
   2698                                                         x, y, nativePen, nativeGraphics,
   2699                                                         &booln));
   2700     return booln;
   2701 }
   2702 
   2703 inline BOOL
   2704 GraphicsPath::IsOutlineVisible(
   2705     IN INT x,
   2706     IN INT y,
   2707     IN const Pen* pen,
   2708     IN const Graphics* g) const
   2709 {
   2710     BOOL booln = FALSE;
   2711 
   2712     GpGraphics* nativeGraphics = NULL;
   2713     GpPen* nativePen = NULL;
   2714 
   2715     if(g)
   2716         nativeGraphics = g->nativeGraphics;
   2717     if(pen)
   2718         nativePen = pen->nativePen;
   2719 
   2720     SetStatus(DllExports::GdipIsOutlineVisiblePathPointI(nativePath,
   2721                                                          x, y, nativePen, nativeGraphics,
   2722                                                          &booln));
   2723     return booln;
   2724 }
   2725 
   2726 #endif
   2727